﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Diagnostics;


namespace WindowsFormsApplication1
{
    public partial class Principal : Form
    {
        public static frm_login pantalla_inicio;
        OracleCommand comando;
        OracleDataReader datos;
        NpgsqlCommand comandopsg;
        NpgsqlDataReader datospsg;
        public Principal()
        {
            InitializeComponent();
        }

        private void enable_controls()
        {
            txt_sentence.Enabled = true;
            btn_exe.Enabled = true;
            dgv_res.Enabled = true;

            lbl_ejecutando.Visible = false;
            this.Refresh();
        }

        private void disable_controls()
        {
            txt_sentence.Enabled = false;
            btn_exe.Enabled = false;
            dgv_res.Enabled = false;

            lbl_ejecutando.Visible = true;
            this.Refresh();
        }


        private void cerrar_sesion()
        {
            this.Dispose();
            pantalla_inicio.cerrar_session();
            pantalla_inicio.Show();
        }

        private void cerrar_programa()
        {
            pantalla_inicio.cerrar_programa();
        }

        private void cerrarSesiónToolStripMenuItem_Click(object sender, EventArgs e)
        {
            cerrar_sesion();
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            cerrar_programa();
        }

        private void vistasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form w = new Tablas();
            w.Show();
        }

        private void sinónimosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frm_login.tipo = 0;
            Form w = new Sinónimos();
            w.Show();
        }

        private void sequenceToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            frm_login.tipo = 1;
            Form w = new Sinónimos();
            w.Text = "Sequences";
            w.Show();
        }

        private void procedimientosToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            frm_login.tipo = 2;
            Form w = new Sinónimos();
            w.Text = "Procedimientos";
            w.Show();
        }

        private void sobreLaBDToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form w = new Vistas();
            w.Show();
        }

        private void sobreLaBDToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form w = new Instancia();
            w.Show();
        }

        private void Principal_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void btn_exe_Click(object sender, EventArgs e)
        {
            try
            {
                dgv_res.Columns.Clear();
                dgv_res.Rows.Clear();
                disable_controls();
                int i = 0;
                int j;
                String time;
                Stopwatch crono = new Stopwatch();

                if (frm_login.oracle)
                {

                    comando = new OracleCommand(txt_sentence.Text, frm_login.con);
                    crono.Start();
                    datos = comando.ExecuteReader();
                    time = crono.ElapsedMilliseconds.ToString();
                    crono.Stop();
                    int columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_res.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_res.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_res.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {

                    comandopsg = new NpgsqlCommand(txt_sentence.Text, frm_login.conn);
                    crono.Start();
                    datospsg = comandopsg.ExecuteReader();
                    time = crono.ElapsedMilliseconds.ToString();
                    crono.Stop();
                    int columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_res.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_res.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_res.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }

                }
                lbl_totfilas.Text = i.ToString();
                lbl_tiempo.Text = time + " ms";

            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }

    }

        private void Principal_Load(object sender, EventArgs e)
        {
            if (frm_login.postgre)
            {
                sinónimosToolStripMenuItem.Visible = false;
            }
        }

        private void llb_cerrar_sesion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            cerrar_sesion();
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            cerrar_programa();
        }
    }
}
